#ifndef ACTOR_H
#define ACTOR_H

#include <allegro.h>
#include "game.h"
#include "collisionManager.h"
#include "actorGraphic.h"

/*La clase actor representa a todos los objetos que se mueven en pantalla
*/
class Actor{
    public:

        /*Constructor*/
        Actor(Game *g);
        /*Destructor*/
        virtual ~Actor();

        /*Dibuja al actor en pantalla*/
        virtual void draw(BITMAP *bmp);

        /*Actualiza al actor*/
        virtual void update();
        /*Realiza la logica del actor*/
        virtual void move();
        /**/
        virtual void init();
        /*Retorna el ancho grafico del actor*/
        virtual int get_w();
        /*retorna la altura grafica del actor*/
        virtual int get_h();

        /*setea el X de la posicion*/
        void set_x(int pos_x);
        /*setea el Y de la posicion*/
        void set_y(int pos_y);

        /*setea el actor grafico correspondiente a este actor*/
        void set_actor_graphic(ActorGraphic *ag);
        /*Obtiene el X de la posicion*/
        int get_x();
        /*Obtiene el Y de la posicion*/
        int get_y();
        /*Retorna la posicion x desde donde comienza la grafica del actor*/
        int get_graph_x();
        /*Retorna la posicion y desde donde comienza la grafica del actor*/
        int get_graph_y();

        /*Retorna la mascara de su representacion grafica*/
        Mask *get_graph_mask();
        /*Setea is_detected*/
        void set_is_detected(bool tf);
        /*Retorna is_detected*/
        bool get_is_detected();
        /*Setea el dano que produce la colision*/
        void set_power(int pow);
        /*Retorna el dano que produce la colision*/
        int get_power();
        /*Setea el metodo de colision que deseo usar*/
        void set_collision_method(CollisionManager::collision_method_t cm);
        /*Retorna el metodo de colision*/
        CollisionManager::collision_method_t get_collision_method();
        /*Notifica de una colision. who es quien colisona a este actor y damage es el dano que produce*/
        virtual void hit(Actor *who, int damage);
        /*Setea el equipo al que pertenece el actor*/
        void set_team(Game::team_t tm);
        /*Retorna el equipo al que pertenece*/
        Game::team_t get_team();

    protected:
        int x, y; //posicion del actor
        ActorGraphic *agraph; //referencia al grafico de este actor

        Game *game;
        int power; //Dano que produce nuestro actor
        Game::team_t team; //Equipo al que pertenece nuestro actor
        bool is_detectable; //indica si el actor es detectable o no
        CollisionManager::collision_method_t collision_method; //tipo de colision que usamos
};

#endif
